﻿using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using Sinacor.Infra.Service.Validation;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;

namespace Sinacor.Servico.Bovespa.Corretagem.BusinessLogic
{
    /// <summary>
    /// Business Logic Verificacao
    /// </summary>
    public class Verificacao : BaseBusinessLogic
    {

        #region Constantes de Erro

        private const int ERRO_VERIFICACAO_AGENTENAOEXISTE = 000000;
        private const int ERRO_VERIFICACAO_ASSESSORNAOEXISTE = 000001;
        private const int ERRO_VERIFICACAO_ATIVONAOEXISTE = 000002;
        private const int ERRO_VERIFICACAO_CODIGOTABELABENEFICIONAOEXISTE = 000003;
        private const int ERRO_VERIFICACAO_CODIGOTABELAPADRAONAOEXISTE = 000004;
        private const int ERRO_VERIFICACAO_MERCADONAOEXISTE = 000000;
        private const int ERRO_VERIFICACAO_NATUREZAOPERACAONAOEXISTE = 000001;
        private const int ERRO_VERIFICACAO_NENHUMCAMPOPREENCHIDO = 000002;
        private const int ERRO_VERIFICACAO_OPERADORNAOEXISTE = 000003;        

        #endregion

        #region Construtor
        public Verificacao()
            : base()
        {

        }
        #endregion

        #region MÃ©todos

        /// <summary>
        /// MÃ©todo ConsultarVerificacao
        /// </summary>
        public List<BusinessEntity.Verificacao> ConsultarVerificacao(BusinessEntity.Parameter.ConsultarVerificacao consultarverificacao)
        {
            ResourceAccess.Verificacao raVerificacao = new Sinacor.Servico.Bovespa.Corretagem.ResourceAccess.Verificacao();
            return raVerificacao.ConsultarVerificacao(consultarverificacao);
        }

        /// <summary>
        /// MÃ©todo ExcluirVerificacao
        /// </summary>
        public void ExcluirVerificacao(BusinessEntity.Parameter.ExcluirVerificacao excluirverificacao)
        {
            ResourceAccess.Verificacao raVerificacao = new Sinacor.Servico.Bovespa.Corretagem.ResourceAccess.Verificacao();
            raVerificacao.ExcluirVerificacao(excluirverificacao);
        }

        /// <summary>
        /// MÃ©todo SalvarVerificacao
        /// </summary>
        public void SalvarVerificacao(List<BusinessEntity.Verificacao> verificacao)
        {
            //Validar Verificacao
            ValidarVerificacao(verificacao);


            //Excluir verificacao
            foreach (BusinessEntity.Verificacao item in verificacao)
            {
                BusinessEntity.Parameter.ExcluirVerificacao pExcluirVerificacao = new Sinacor.Servico.Bovespa.Corretagem.BusinessEntity.Parameter.ExcluirVerificacao();
                pExcluirVerificacao.CodigoPoliticaCorretagem = item.CodigoPoliticaCorretagem;
                pExcluirVerificacao.DataInicial = item.DataInicial;
                ExcluirVerificacao(pExcluirVerificacao);
            }

            //Salvar Verificacao
            ResourceAccess.Verificacao raVerificacao = new Sinacor.Servico.Bovespa.Corretagem.ResourceAccess.Verificacao();
            raVerificacao.SalvarVerificacao(verificacao);
        }

        /// <summary>
        /// MÃ©todo ValidarAgente
        /// </summary>
        public void ValidarAgente(BusinessEntity.Verificacao verificacao)
        {
                ResourceAccess.Verificacao raVerificacao = new Sinacor.Servico.Bovespa.Corretagem.ResourceAccess.Verificacao();
                if (!raVerificacao.ValidarAgente(verificacao))
                {
                    throw new BusinessException(ERRO_VERIFICACAO_AGENTENAOEXISTE);
                }
        }

        /// <summary>
        /// MÃ©todo ValidarAssessor
        /// </summary>
        public void ValidarAssessor(BusinessEntity.Verificacao verificacao)
        {
                ResourceAccess.Verificacao raVerificacao = new Sinacor.Servico.Bovespa.Corretagem.ResourceAccess.Verificacao();
                if (!raVerificacao.ValidarAssessor(verificacao))
                {
                    throw new BusinessException(ERRO_VERIFICACAO_ASSESSORNAOEXISTE);
                }         
        }

        /// <summary>
        /// MÃ©todo ValidarAtivo
        /// </summary>
        public void ValidarAtivo(BusinessEntity.Verificacao verificacao)
        {
                ResourceAccess.Verificacao raVerificacao = new Sinacor.Servico.Bovespa.Corretagem.ResourceAccess.Verificacao();
                if (!raVerificacao.ValidarAtivo(verificacao))
                {
                    throw new BusinessException(ERRO_VERIFICACAO_ATIVONAOEXISTE);
                }
        }

        /// <summary>
        /// MÃ©todo ValidarCodigoTabelaBeneficio
        /// </summary>
        public void ValidarCodigoTabelaBeneficio(BusinessEntity.Verificacao verificacao)
        {
                ResourceAccess.Verificacao raVerificacao = new Sinacor.Servico.Bovespa.Corretagem.ResourceAccess.Verificacao();
                if (!raVerificacao.ValidarCodigoTabelaBeneficio(verificacao))
                {
                    throw new BusinessException(ERRO_VERIFICACAO_CODIGOTABELABENEFICIONAOEXISTE);
                }
        }

        /// <summary>
        /// MÃ©todo ValidarCodigoTabelaPadrao
        /// </summary>
        public void ValidarCodigoTabelaPadrao(BusinessEntity.Verificacao verificacao)
        {
               ResourceAccess.Verificacao raVerificacao = new Sinacor.Servico.Bovespa.Corretagem.ResourceAccess.Verificacao();
                if (!raVerificacao.ValidarCodigoTabelaPadrao(verificacao))
                {
                    throw new BusinessException(ERRO_VERIFICACAO_CODIGOTABELAPADRAONAOEXISTE);
                }
        }

        /// <summary>
        /// MÃ©todo ValidarNaturezaOperacao
        /// </summary>
        public void ValidarNaturezaOperacao(BusinessEntity.Verificacao verificacao)
        {
                if (!verificacao.TipoNaturezaOperacao.Value.Equals("C") || !verificacao.TipoNaturezaOperacao.Value.Equals("V"))
                {
                    throw new BusinessException(ERRO_VERIFICACAO_NATUREZAOPERACAONAOEXISTE);
                }
        }

        /// <summary>
        /// MÃ©todo ValidarOperador
        /// </summary>
        public void ValidarOperador(BusinessEntity.Verificacao verificacao)
        {
                ResourceAccess.Verificacao raVerificacao = new Sinacor.Servico.Bovespa.Corretagem.ResourceAccess.Verificacao();
                if (!raVerificacao.ValidarOperador(verificacao))
                {
                    throw new BusinessException(ERRO_VERIFICACAO_OPERADORNAOEXISTE);
                }
        }

        /// <summary>
        /// MÃ©todo ValidarTipoMercado
        /// </summary>
        public void ValidarTipoMercado(BusinessEntity.Verificacao verificacao)
        {
            if (Array.BinarySearch(Enum.GetValues(typeof(BusinessEntity.Enum.TipoMercado)), verificacao.TipoMercado.Value) < 0)                 
                throw new BusinessException(ERRO_VERIFICACAO_MERCADONAOEXISTE);
        }

        /// <summary>
        /// MÃ©todo ValidarVerificacao
        /// </summary>
        public void ValidarVerificacao(List<BusinessEntity.Verificacao> verificacao)
        {
            foreach (BusinessEntity.Verificacao item in verificacao)
            {
                if (item.Agente.HasValue)
                {
                    ValidarAgente(item);
                }
                else if (item.Assessor.HasValue)
                {
                    ValidarAssessor(item);
                }
                else if (item.Ativo != null || item.Ativo.Trim() != "")
                {
                    ValidarAtivo(item);
                }
                else if (item.CodigoTabelaBeneficio != null || item.CodigoTabelaBeneficio != 0)
                {
                    ValidarCodigoTabelaBeneficio(item);
                }
                else if (item.CodigoTabelaPadrao != null || item.CodigoTabelaPadrao != 0)
                {
                    ValidarCodigoTabelaPadrao(item);
                }
                else if (item.TipoNaturezaOperacao.HasValue)
                {
                    ValidarNaturezaOperacao(item);
                }
                else if (item.Operador.HasValue)
                {
                    ValidarOperador(item);
                }
                else if (item.TipoMercado.HasValue)
                {
                    ValidarTipoMercado(item);
                }
                else
                {
                    throw new BusinessException(ERRO_VERIFICACAO_NENHUMCAMPOPREENCHIDO);
                }
            }

        }


        #endregion

    }
}
